package view

import (
	"time"
	{{- if .IsNeo4j }}
    "github.com/liuxd6825/dapr-go-ddd-sdk/ddd/ddd_repository/ddd_neo4j"
    {{- end }}
)

//
// BaseView
// @Description: 视图基类
//
type BaseView struct {
{{- range $name, $property := .Properties}}
{{- if not $property.IsArray}}
    {{$property.UpperName}} {{if $property.IsArray}}[]*{{end}}{{$property.LanType}} `json:"{{$property.JsonName}},omitempty"  bson:"{{$property.BsonName}}" {{$property.GormTagName}} {{if $property.HasValidate}} validate:"{{$property.Validate}}"{{- end}}` {{if $property.HasDescription }} // {{$property.Description}}{{ end }}
{{- end}}
{{- end}}
}

//
// BaseViewMetadata
// @Description: 视图基类元数据
//
type BaseViewMetadata struct {
{{- range $name, $property := .Properties}}
{{- if not $property.IsArray}}
    {{$property.UpperName}} metadata.Property
{{- end}}
{{- end}}
	Properties  metadata.Properties
}

{{- if .IsNeo4j }}
//
// BaseNodeView
// @Description: 节点视图基类
//
type BaseNodeView struct {
    BaseView  `bson:",inline"`
	Nid      int64    `json:"-" bson:"nid"`                                       // neo4j主键id
    GraphId  string   `json:"graphId" bson:"graph_id" gorm:"index:idx_graph_id"`  // 关系图id
	Labels   []string `json:"labels" bson:"labels" gorm:"-"`                      // neo4j标签
}

//
// BaseNodeViewMetadata
// @Description: 节点视图基类元数据
//
type BaseNodeViewMetadata struct {
    BaseViewMetadata
    Nid      metadata.Property
    GraphId  metadata.Property
    Labels   metadata.Property
}

//
// BaseRelationView
// @Description: 关系视图基类
//
type BaseRelationView struct {
    BaseView  `bson:",inline"`
	Nid      int64  `json:"-" bson:"nid" gorm:"-"`                              // neo4j主键id
	Sid      int64  `json:"-" bson:"sid" gorm:"-"`                              // neo4j关系开始id
	Eid      int64  `json:"-" bson:"eid" gorm:"-"`                              // neo4j关系结束id
	GraphId  string `json:"graphId" bson:"graph_id" gorm:"index:idx_graph_id"`  // 关系图id
	RelType  string `json:"relType" bson:"rel_type" gorm:"index:idx_node_type"` // 关系类型
	StartId  string `json:"startId" bson:"start_id" gorm:"index:idx_start_id"`  // 关系开始id
	EndId    string `json:"endId" bson:"end_id" gorm:"index:idx_end_id"`        // 关系结束id
}

//
// BaseRelationViewMetadata
// @Description: 关系视图基类元数据
//
type BaseRelationViewMetadata struct {
    BaseViewMetadata
	Nid      metadata.Property
	Sid      metadata.Property
	Eid      metadata.Property
	GraphId  metadata.Property
	RelType  metadata.Property
	StartId  metadata.Property
	EndId    metadata.Property
}

{{- end }}

var (
	_baseViewMetadata = newBaseViewMetadata()
{{- if .IsNeo4j }}
    _baseNodeViewMetadata = newBaseNodeViewMetadata()
    _baseRelationViewMetadata = newBaseRelationViewMetadata()
{{- end }}
)

//
// GetBaseViewMetadata
// @Description: 获取BaseView元数据
// @return *BaseViewMetadata
//
func GetBaseViewMetadata() *BaseViewMetadata {
	return _baseViewMetadata
}

//
// GetBaseNodeViewMetadata
// @Description: 获取BaseNodeView元数据
// @return *BaseNodeViewMetadata
//
func GetBaseNodeViewMetadata() *BaseNodeViewMetadata {
	return _baseNodeViewMetadata
}

//
// GetBaseRelationViewMetadata
// @Description: 获取BaseRelationViewMetadata元数据
// @return *BaseRelationViewMetadata
//
func GetBaseRelationViewMetadata() *BaseRelationViewMetadata {
	return _baseRelationViewMetadata
}

//
// newBaseViewMetadata
// @Description: 新建BaseView元数据
// @return *BaseViewMetadata
//
func newBaseViewMetadata() *BaseViewMetadata {
	m := &BaseViewMetadata{}
	v := &BaseView{}
	if props, err := metadata.NewProperties(m, v); err != nil {
		panic(err)
	} else {
		m.Properties = props
	}
	return m
}

//
// newBaseNodeViewMetadata
// @Description: 新建BaseNodeViewMetadata元数据
// @return *BaseNodeViewMetadata
//
func newBaseNodeViewMetadata() *BaseNodeViewMetadata {
	m := &BaseNodeViewMetadata{}
	v := &BaseNodeView{}
	if props, err := metadata.NewProperties(m, v); err != nil {
		panic(err)
	} else {
		m.Properties = props
	}
	return m
}


//
// newBaseRelationViewMetadata
// @Description: 新建BaseView元数据
// @return *BaseViewMetadata
//
func newBaseRelationViewMetadata() *BaseRelationViewMetadata {
	m := &newBaseRelationViewMetadata{}
	v := &newBaseRelationView{}
	if props, err := metadata.NewProperties(m, v); err != nil {
		panic(err)
	} else {
		m.Properties = props
	}
	return m
}


// BaseView

{{- range $name, $property := .Properties}}
{{- if not $property.IsArray}}

//
// Get{{$property.UpperName}}
// @Description: 获取 {{$property.Description}}
//
func (v *BaseView) Get{{$property.UpperName}}(){{$property.LanType}} {
    return v.{{$property.UpperName}}
}

//
// Set{{$property.UpperName}}
// @Description: 设置 {{$property.Description}}
//
func (v *BaseView) Set{{$property.UpperName}}(value {{$property.LanType}}) {
    v.{{$property.UpperName}} = value
}
{{- end}}
{{- end}}

//
// GetProperties
// @Description: 获取属性元数据
//
func (v *BaseView) GetProperties() metadata.Properties {
	return _baseViewMetadata.Properties
}


{{- if .IsNeo4j }}
// BaseNodeView

func (b *BaseNodeView) GetNid() int64 {
	return b.Nid
}

func (b *BaseNodeView) SetNid(int2 int64) {
	b.Nid = int2
}

func (b *BaseNodeView) GetLabels() []string {
	return b.Labels
}

func (b *BaseNodeView) SetLabels(v []string) {
	b.Labels = v
}

func (b *BaseNodeView) GetId() string {
	return b.Id
}

func (b *BaseNodeView) SetId(v string) {
	b.Id = v
}

func (b *BaseNodeView) SetGraphId(v string) {
	b.GraphId = v
}

func (b *BaseNodeView) GetGraphId() string {
	return b.GraphId
}

// BaseRelationView

func (b *BaseRelationView) GetId() string {
	return b.Id
}

func (b *BaseRelationView) SetId(v string) {
	b.Id = v
}

func (b *BaseRelationView) SetNid(s int64) {
	b.Nid = s
}

func (b *BaseRelationView) GetNid() int64 {
	return b.Nid
}

func (b *BaseRelationView) SetRelType(s string) {
	b.RelType = s
}

func (b *BaseRelationView) GetRelType() string {
	return b.RelType
}

func (b *BaseRelationView) SetSid(s int64) {
	b.Sid = s
}

func (b *BaseRelationView) GetSid() int64 {
	return b.Sid
}

func (b *BaseRelationView) SetEid(s int64) {
	b.Eid = s
}

func (b *BaseRelationView) GetEid() int64 {
	return b.Eid
}

func (b *BaseRelationView) SetStartId(s string) {
	b.StartId = s
}

func (b *BaseRelationView) GetStartId() string {
	return b.StartId
}

func (b *BaseRelationView) SetEndId(v string) {
	b.EndId = v
}

func (b *BaseRelationView) GetEndId() string {
	return b.EndId
}

func (b *BaseRelationView) SetGraphId(v string) {
	b.GraphId = v
}

func (b *BaseRelationView) GetGraphId() string {
	return b.GraphId
}

{{- end }}

